#include "serial.h"
#include <stdint.h>

#define COM1 0x3F8  // 串口 1 的基地址

// 向指定端口写入一个字节
static inline void outb(uint16_t port, uint8_t val) {
    asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port));
}

// 从指定端口读取一个字节
static inline uint8_t inb(uint16_t port) {
    uint8_t ret;
    asm volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port));
    return ret;
}

// 初始化串口
void serial_init() {
    outb(COM1 + 1, 0x00); // 禁止所有中断
    outb(COM1 + 3, 0x80); // 设置 DLAB 以设置波特率
    outb(COM1 + 0, 0x03); // 除数低字节 (38400 波特率)
    outb(COM1 + 1, 0x00); // 除数高字节
    outb(COM1 + 3, 0x03); // 8 位数据, 无奇偶校验, 1 停止位
    outb(COM1 + 2, 0xC7); // 启用 FIFO，清空，14 字节触发
    outb(COM1 + 4, 0x0B); // 启用 IRQ，设置 RTS/DSR
}

// 判断发送缓冲区是否空
int is_transmit_empty() {
    return inb(COM1 + 5) & 0x20;
}

// 发送单个字符
void serial_write_char(char c) {
    while (!is_transmit_empty()); // 等待发送缓冲区空
    outb(COM1, c);
}

// 发送字符串
void serial_write(const char *str) {
    for (int i = 0; str[i] != '\0'; i++) {
        serial_write_char(str[i]);
    }
}
